package com.ynding;

import java.applet.Applet;
import java.awt.*;

/**
 * <p> 彩带庆贺</p>
 *
 * @author ynding
 * @version 2021/4/14
 **/
public class Confetti extends Applet implements Runnable {
    //定义一个线程类
    private Thread m_snow = null;
    private int flakes[][];
    private Image offscreenImage;
    private String m_back = "none";
    private Image backdrop;
    private Graphics offscreenGraphics;
    private Image frame;
    private int[] colors;
    private Color[] cl = {Color.red, Color.green, Color.blue, Color.yellow,
            Color.cyan, Color.magenta, Color.orange, Color.pink,
            Color.white, Color.lightGray, Color.gray, Color.darkGray,
            Color.black};
    private String[] cNames = {"red", "green", "blue", "yellow", "cyan",
            "magenta", "orange", "pink", "white", "lightGray", "gray", "darkGray",
            "black"};
    private int xSize;
    private int ySize;
    private int pixSize;
    private int amount = 0;
    private int delay;
    private int xMin, xMax, yMin, yMax;

    /**
     * 获取小应用程序相关信息
     *
     * @return
     */
    @Override
    public String getAppletInfo() {
        return "Name: Confetti\r\n Author: Ali";
    }

    //初始化，获取各参数的值
    @Override
    public void init() {
        String param;
        colors = new int[13];
        amount = 0;
        for (int t = 0; t < 13; t++) {
            param = getParameter(cNames[t]);
            if (param != null) {
                colors[t] = Integer.parseInt(param);
            }
        }
        param = getParameter("pixSize");
        if (param != null) {
            pixSize = Integer.parseInt(param);
        } else {
            pixSize = 2;
        }
        for (int t = 0; t < 13; t++) {
            int tmp = colors[t];
            colors[t] += amount;
            amount += tmp;
        }
        flakes = new int[amount][2];
        param = getParameter("back");
        if (param != null) {
            m_back = param;
        }
        param = getParameter("frame");
        if (param != null) {
            frame = getImage(getCodeBase(), param);
        } else {
            frame = null;
        }
        param = getParameter("delay");
        if (param != null) {
            delay = Integer.parseInt(param);
        } else {
            delay = 100;
        }
        param = getParameter("xMin");
        if (param != null) {
            xMin = Integer.parseInt(param);
        } else {
            xMin = 0;
        }
        param = getParameter("xMax");
        if (param != null) {
            xMax = Integer.parseInt(param);
        } else {
            delay = 5;
        }
        param = getParameter("yMin");
        if (param != null) {
            yMin = Integer.parseInt(param);
        } else {
            yMin = 0;
        }
        param = getParameter("yMax");
        if (param != null) {
            yMax = Integer.parseInt(param);
        } else {
            yMax = 5;
        }
        xSize = size().width;
        ySize = size().height;
        backdrop = getImage(getCodeBase(), m_back);
        for (int i = 0; i < amount; i++) {
            flakes[i][0] = (int) (Math.random() * xSize);
            flakes[i][1] = (int) (Math.random() * ySize);
        }
        offscreenImage = createImage(xSize, ySize);
        offscreenGraphics = offscreenImage.getGraphics();
        System.out.println("Confetti (C)2003 Ali");
    }

    //newimage()方法
    public void newimage() {
        offscreenGraphics.drawImage(backdrop, 0, 0, xSize, ySize, null);
        offscreenGraphics.setColor(Color.red);
        int onCl = 0;
        for (int i = 0; i < amount; i++) {
            int xDif = xMax - xMin;
            int yDif = yMax - yMin;
            double xV = (Math.random() * xDif * 2 - xDif);
            if (xV < 0) {
                xV -= xMin;
            } else {
                xV += xMin;
            }
            flakes[i][0] += (int) (xV);
            flakes[i][1] += (int) (Math.random() * yDif) + yMin;
            if (flakes[i][0] < 0) {
                flakes[i][0] = xSize;
            }
            if (flakes[i][0] > xSize - 1) {
                flakes[i][0] = 0;
            }
            if (flakes[i][1] > ySize - 1) {
                flakes[i][1] = 0;
                flakes[i][0] = (int) (Math.random() * xSize);
            }
            while (i > colors[onCl]) {
                onCl++;
                offscreenGraphics.setColor(cl[onCl]);
            }
            offscreenGraphics.fillRect(flakes[i][0], flakes[i][1], pixSize, pixSize);
        }
        if (frame != null) {
            offscreenGraphics.drawImage(frame, 0, 0, xSize, ySize, null);
        }
    }

    //destroy()方法
    @Override
    public void destroy() {
        offscreenGraphics.dispose();
    }

    //paint()方法
    @Override
    public void paint(Graphics g) {
        g.drawImage(offscreenImage, 0, 0, this);
    }

    //update()方法
    @Override
    public void update(Graphics g) {
        paint(g);
    }

    //start()方法，启动线程
    @Override
    public void start() {
        if (m_snow == null) {
            m_snow = new Thread(this);
            m_snow.start();
        }
    }

    //stop()方法，停止线程
    @Override
    public void stop() {
        if (m_snow != null) {
            m_snow.stop();
            m_snow = null;
        }
    }

    //run()方法
    public void run() {
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(backdrop, 0);
        if (frame != null) {
            mt.addImage(frame, 0);
        }
        try {
            mt.waitForAll();
        } catch (Exception e) {
        }
        while (true) {
            try {
                //获取系统当前时间
                long nw = System.currentTimeMillis();
                newimage();//调用newimage()方法
                repaint();
                long tm = delay - (System.currentTimeMillis() - nw);
                if (tm < 10) {
                    tm = 10;
                }
                Thread.sleep(tm);
                newimage();
            } catch (InterruptedException e)//抛出异常
            {
                stop();
            }
        }
    }
}

